package com.atguigu.daijia.customer.service.impl;


import com.atguigu.daijia.coupon.client.CouponFeignClient;
import com.atguigu.daijia.customer.service.CouponService;
import com.atguigu.daijia.model.vo.base.PageVo;
import com.atguigu.daijia.model.vo.coupon.AvailableCouponVo;
import com.atguigu.daijia.model.vo.coupon.NoReceiveCouponVo;
import com.atguigu.daijia.model.vo.coupon.NoUseCouponVo;
import com.atguigu.daijia.model.vo.coupon.UsedCouponVo;
import com.atguigu.daijia.model.vo.order.OrderBillVo;
import com.atguigu.daijia.order.client.OrderInfoFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
// 使用Slf4j日志框架记录日志
@Slf4j
// 标明该类是一个Spring服务类
@Service
// 忽略未经检查的类型转换警告，因为在这个类中会进行一些强制类型转换操作
@SuppressWarnings({"unchecked", "rawtypes"})
public class CouponServiceImpl implements CouponService {

    // 注入CouponFeignClient客户端，用于远程调用优惠券服务
    private final CouponFeignClient couponFeignClient;

    // 构造函数注入CouponFeignClient实例
    public CouponServiceImpl(CouponFeignClient couponFeignClient) {
        this.couponFeignClient = couponFeignClient;
    }

    /**
     * 根据客户ID查询该客户尚未领取的优惠券分页信息
     *
     * @param customerId 客户ID，用于查询特定客户的优惠券信息
     * @param page 当前页码，用于分页查询
     * @param limit 每页记录数，用于限制每页返回的优惠券数量
     * @return 返回一个包含未领取优惠券信息的分页对象
     */
    @Override
    public PageVo<NoReceiveCouponVo> findNoReceivePage(Long customerId, Long page, Long limit) {
        // 调用CouponFeignClient的findNoReceivePage方法并获取返回的数据
        return couponFeignClient.findNoReceivePage(customerId, page, limit).getData();
    }

    /**
     * 根据客户ID查询该客户未使用的优惠券分页信息
     *
     * @param customerId 客户ID，用于查询特定客户的优惠券信息
     * @param page 当前页码，用于分页查询
     * @param limit 每页记录数，用于限制每页返回的优惠券数量
     * @return 返回一个包含未使用优惠券信息的分页对象
     */
    @Override
    public PageVo<NoUseCouponVo> findNoUsePage(Long customerId, Long page, Long limit) {
        return couponFeignClient.findNoUsePage(customerId, page, limit).getData();
    }

    /**
     * 根据客户ID查询该客户已使用的优惠券分页信息
     *
     * @param customerId 客户ID，用于查询特定客户的优惠券信息
     * @param page 当前页码，用于分页查询
     * @param limit 每页记录数，用于限制每页返回的优惠券数量
     * @return 返回一个包含已使用优惠券信息的分页对象
     */
    @Override
    public PageVo<UsedCouponVo> findUsedPage(Long customerId, Long page, Long limit) {
        return couponFeignClient.findUsedPage(customerId, page, limit).getData();
    }

    /**
     * 客户领取优惠券
     *
     * @param customerId 客户ID，表示领取优惠券的客户
     * @param couponId 优惠券ID，表示被领取的优惠券
     * @return 返回一个布尔值，表示优惠券领取是否成功
     */
    @Override
    public Boolean receive(Long customerId, Long couponId) {
        return couponFeignClient.receive(customerId, couponId).getData();
    }

    // 注入OrderInfoFeignClient客户端，用于远程调用订单信息服务
    @Autowired
    private OrderInfoFeignClient orderInfoFeignClient;

    /**
     * 根据客户ID和订单ID查询可用的优惠券
     *
     * @param customerId 客户ID，用于查询特定客户的优惠券信息
     * @param orderId 订单ID，用于获取订单的支付金额
     * @return 返回一个包含可用优惠券的列表
     */
    @Override
    public List<AvailableCouponVo> findAvailableCoupon(Long customerId, Long orderId) {
        // 首先调用orderInfoFeignClient获取订单的支付金额信息
        OrderBillVo orderBillVo=orderInfoFeignClient.getOrderBillInfo(orderId).getData();
        // 根据客户ID和订单支付金额调用couponFeignClient查询可用优惠券
        return couponFeignClient.findAvailableCoupon(customerId, orderBillVo.getPayAmount()).getData();
    }
}

